package com.xncoding.design.observation.demo;

import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ProducerConsumer {

	/**
	 * 对于多线程程序来说，不管任何编程语言，生产者和消费者模型都是最经典的。
	 * 就像学习每一门编程语言一样，Hello World!都是最经典的例子
	 * 。
	 * 实际上，准确说应该是“生产者-消费者-仓储”模型，
	 * 离开了仓储，生产者消费者模型就显得没有说服力了。
	 * 
	 * 对于此模型，应该明确一下几点：
	 * 1生产者仅仅在仓储未满时候生产，仓满则停止生产。
	 * 2消费者仅仅在仓储有产品时候才能消费，仓满则停止生产。
	 * 3当消费者发现仓储没产品可消费时候会通知生产者生产。
	 * 4生产者在生产出可消旨产品时候，应该通知等待的消费者去消费。
	 */
	public static void main(String[] args){
		
		   Set<Product> mobileSet=new HashSet<Product>();
		   Product product=null;
	       for(int i=0;i<100;i++){
	        	product=new Product((int)(Math.random()*100));
	        	
	        	mobileSet.add(product);
	       }
		   
	       //总工作任务队列 
	       ConcurrentLinkedQueue<Product> workQueue=new ConcurrentLinkedQueue<Product>(mobileSet);
	       workQueue.size();
		   //仓储
	       Storage s = new Storage(workQueue);
	      
	      
	      
	       ExecutorService service = Executors.newCachedThreadPool();
	     
	        
	       Producer p = new Producer("张三",s);
	       Producer p2 = new Producer("李四",s);
	        
	       Consumer c = new Consumer("王五", s);
	       Consumer c2 = new Consumer("老刘", s);
	       Consumer c3 = new Consumer("老林", s);
	    
	       service.submit(p);
	       service.submit(p2);
	       service.submit(c);
	       service.submit(c2);
	       service.submit(c3);
	       
		   //关闭线程池，
	       service.shutdown();
	        
	
	}
	
	
	
}
